// https://leetcode.cn/problems/game-of-life/
// Created by ade on 2022/9/19.
// 如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
//如果活细胞周围八个位置有两个或三个活细胞，则该位置活细胞仍然存活；
//如果活细胞周围八个位置有超过三个活细胞，则该位置活细胞死亡；
//如果死细胞周围正好有三个活细胞，则该位置死细胞复活；
//下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的，其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态，返回下一个状态。
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    void gameOfLife(vector <vector<int>> &board) {
        int row = board.size();
        int col = board[0].size();
        vector<vector<int>> nums = {};
        nums.resize(row, vector<int>(col));
        vector <pair<int, int >> directions = {
                {-1, -1},
                {0,  -1},
                {1,  -1},
                {1,  0},
                {1,  1},
                {0,  1},
                {-1, 1},
                {-1, 0},
        };
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                for (auto &d : directions) {
                    if (i + d.first >= 0 && i + d.first < row && j + d.second >= 0 && j + d.second < col) {
                        nums[i][j] += board[i + d.first][j + d.second] == 1 ? 1 : 0;
                    }
                }
            }
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if(board[i][j] == 1 && nums[i][j] < 2){
                    board[i][j] = 0;
                    continue;
                }
                if(board[i][j] == 1 && nums[i][j] <= 3){
                    continue;
                }
                if(board[i][j] == 1 && nums[i][j] > 3){
                    board[i][j] = 0;
                    continue;
                }
                if(board[i][j] == 0 && nums[i][j] == 3){
                    board[i][j] = 1;
                    continue;
                }
            }
        }

    }
};

int main() {
    Solution so;

}